package com.itheima.edu.info.manager.service;

import com.itheima.edu.info.manager.dao.BaseStudentDao;
import com.itheima.edu.info.manager.dao.OtherStudentDao;
import com.itheima.edu.info.manager.dao.StudentDao;
import com.itheima.edu.info.manager.domain.Student;
import com.itheima.edu.info.manager.factory.StudentFactory;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Properties;

/*
    业务员类
        1. 这里的所有方法【功能】都是给客服用
        2. 如果某些业务涉及到要对数据仓库的数据进行访问的话,那么需要在业务员类中操作库管对象
        3. 该类的核心作用是用于处理业务逻辑,例如: 判断录入的id是否存在
 */
public class StudentService {

    private BaseStudentDao dao = StudentFactory.getStudentDao();

    //业务员中的添加学生功能
    public boolean addStudent(Student stu) {
        //1. 指挥库管把学生对象添加进系统
        //2. 将库管添加的结果再传递给当前类方法的调用者(客服)
        return dao.addStudent(stu);
    }

    //业务员中的判断学号是否存在功能
    public boolean isExists(String id) {
        //1. 拿到系统中已有的所有学号信息
        // 1.1 指挥库管将系统中所有学生信息查找出来
        /*
            1. allStudents = {null,null,null,null,null}
            2. allStudents = {stu,stu,null,null,null}
            3. allStudents = {stu,stu,stu,stu,stu}
         */
        Student[] allStudents = dao.findAllStudents();
        //2. 拿要校验的id去已有的学号中遍历查找
        //2.1 先假设要查找的id不存在
        boolean flag = false;
        //2.2 遍历所有学生信息
        for (int i = 0; i < allStudents.length; i++) {
            //2.3 拿到每一个学生对象的学号
            Student stu = allStudents[i];
            //2.4 当前索引位置的学生不为null,并且该学生的学号和要查找的学号一致时,修改标记
            if (stu != null && stu.getSid().equals(id)) {
                flag = true;
            }
        }

        return flag;
    }

    //业务员中的查找所有学生功能
    public Student[] findAllStudents() {
        //1. 指挥库管拿到所有学生信息
         /*
            1. allStudents = {null,null,null,null,null}   -- return null;
            2. allStudents = {stu,stu,null,null,null}     -- return allStudents
            3. allStudents = {stu,stu,stu,stu,stu}        -- return allStudents
         */
        Student[] allStudents = dao.findAllStudents();

        /*
            2. 对库管返回的学生数组进行数据分析处理:
                2.1 如果库管返回的数组中全是null,当前方法直接返回null
                2.2 只要库管给我的数组中有一个学生信息,当前方法返回整个库管传过来的学生数组
         */
        //先假设查到的数组allStudents里面全是null  -- 假设一个学生都没有
        boolean flag = false;

        //遍历allStudents
        for (int i = 0; i < allStudents.length; i++) {
            //拿到每一个索引位置的元素进行判断
            if (allStudents[i] != null) {
                //只要有一个位置不为null,说明有学生,修改标记位为true
                flag = true;
                break;
            }
        }
        //根据flag的值来决定本次方法的返回值
        if (flag) {
            //有学生,返回allStudents
            //返回之前对数组中的内容进行排序
            Arrays.sort(allStudents, new Comparator<Student>() {
                @Override
                public int compare(Student o1, Student o2) {
                    if (o1 != null && o2 != null) {
                        return o1.getSid().compareTo(o2.getSid());
                    } else {
                        return 0;
                    }
                }
            });

            return allStudents;
        } else {
            return null;
        }
    }

    //业务员中的删除学生功能
    public void deleteStudentById(String delId) {
        //指挥库管进行删除学生动作
        dao.deleteStudentId(delId);
    }

    //业务员中的修改学生功能
    public void updateStudentById(String updateId, Student newStu) {
        //指挥库管进行修改学生动作
        dao.updateStudentById(updateId, newStu);
    }

    public boolean login(String name, String password) {
        Properties prop = dao.findAllUsers();
        boolean flag = false;
        if (prop.containsKey(name) && password.equals(prop.getProperty(name))) {
            flag = true;
        }
        return flag;
    }
}
